package com.styletransfer.mapper.provider;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;

/**
 * 风格SQL提供者
 */
public class StyleSqlProvider {

    /**
     * 带条件的分页查询SQL
     * 
     * @param offset 偏移量
     * @param limit 限制数
     * @param keyword 关键词
     * @param tagId 标签ID
     * @param categoryId 分类ID
     * @param userId 用户ID
     * @param orderBy 排序字段
     * @param orderType 排序类型
     * @return SQL语句
     */
    public String findByPageWithConditions(
            @Param("offset") Integer offset, 
            @Param("limit") Integer limit, 
            @Param("keyword") String keyword, 
            @Param("tagId") Long tagId, 
            @Param("categoryId") Long categoryId, 
            @Param("userId") Long userId, 
            @Param("orderBy") String orderBy, 
            @Param("orderType") String orderType) {
        
        SQL sql = new SQL();
        sql.SELECT("s.*").FROM("style s");
        
        // 添加标签过滤条件
        if (tagId != null) {
            sql.INNER_JOIN("style_tag st ON s.id = st.style_id");
            sql.WHERE("st.tag_id = #{tagId}");
        }
        
        // 添加基本过滤条件
        sql.WHERE("s.status = 1");
        
        // 添加关键词过滤条件
        if (keyword != null && !keyword.isEmpty()) {
            sql.WHERE("(s.name LIKE CONCAT('%', #{keyword}, '%') OR s.description LIKE CONCAT('%', #{keyword}, '%'))");
        }
        
        // 添加分类过滤条件
        if (categoryId != null) {
            sql.WHERE("s.category_id = #{categoryId}");
        }
        
        // 添加用户过滤条件
        if (userId != null) {
            sql.WHERE("s.creator_id = #{userId}");
        }
        
        // 添加排序条件
        String finalOrderBy = "s.id";
        if (orderBy != null && !orderBy.isEmpty()) {
            // 转换驼峰命名为下划线命名
            finalOrderBy = "s." + camelToUnderscore(orderBy);
        }
        
        String finalOrderType = "DESC";
        if (orderType != null && (orderType.equalsIgnoreCase("asc") || orderType.equalsIgnoreCase("desc"))) {
            finalOrderType = orderType.toUpperCase();
        }
        
        sql.ORDER_BY(finalOrderBy + " " + finalOrderType);
        
        // 添加分页
        return sql.toString() + " LIMIT #{offset}, #{limit}";
    }
    
    /**
     * 带条件的统计SQL
     * 
     * @param keyword 关键词
     * @param tagId 标签ID
     * @param categoryId 分类ID
     * @param userId 用户ID
     * @return SQL语句
     */
    public String countWithConditions(
            @Param("keyword") String keyword, 
            @Param("tagId") Long tagId, 
            @Param("categoryId") Long categoryId, 
            @Param("userId") Long userId) {
        
        SQL sql = new SQL();
        sql.SELECT("COUNT(DISTINCT s.id)").FROM("style s");
        
        // 添加标签过滤条件
        if (tagId != null) {
            sql.INNER_JOIN("style_tag st ON s.id = st.style_id");
            sql.WHERE("st.tag_id = #{tagId}");
        }
        
        // 添加基本过滤条件
        sql.WHERE("s.status = 1");
        
        // 添加关键词过滤条件
        if (keyword != null && !keyword.isEmpty()) {
            sql.WHERE("(s.name LIKE CONCAT('%', #{keyword}, '%') OR s.description LIKE CONCAT('%', #{keyword}, '%'))");
        }
        
        // 添加分类过滤条件
        if (categoryId != null) {
            sql.WHERE("s.category_id = #{categoryId}");
        }
        
        // 添加用户过滤条件
        if (userId != null) {
            sql.WHERE("s.creator_id = #{userId}");
        }
        
        return sql.toString();
    }
    
    /**
     * 驼峰命名转下划线命名
     * 
     * @param camel 驼峰命名
     * @return 下划线命名
     */
    private String camelToUnderscore(String camel) {
        return camel.replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase();
    }
}
